const { ethers } = require("ethers");

// 连接到以太坊网络（可以使用 Infura, Alchemy 或其他节点提供商）
const provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');

// 定义要归集的目标地址（冷钱包或主要钱包）
const targetAddress = "0xYourTargetAddress";

// 要归集的多个钱包的私钥（模拟多钱包）
const privateKeys = [
  '0xPrivateKey1',
  '0xPrivateKey2',
  '0xPrivateKey3'
  // 可以添加更多私钥
];

// 遍历所有钱包，检查余额并归集到目标地址
async function collectFunds() {
  for (const privateKey of privateKeys) {
    // 使用私钥创建钱包
    const wallet = new ethers.Wallet(privateKey, provider);

    // 获取钱包余额
    const balance = await provider.getBalance(wallet.address);
    console.log(`钱包地址: ${wallet.address}, 余额: ${ethers.utils.formatEther(balance)} ETH`);

    // 如果余额大于0，则进行转账归集
    if (balance.gt(0)) {
      // 计算所需的交易费用 (Gas Limit * Gas Price)
      const gasPrice = await provider.getGasPrice();  // 当前网络 Gas 价格
      const gasLimit = 21000;  // 转账所需的 Gas Limit
      const txFee = gasPrice.mul(gasLimit);  // 交易手续费

      // 如果余额大于手续费，才进行转账
      if (balance.sub(txFee).gt(0)) {
        // 创建交易对象
        const tx = {
          to: targetAddress,
          value: balance.sub(txFee),  // 归集余额减去手续费
          gasLimit: gasLimit,
          gasPrice: gasPrice
        };

        // 发送交易
        try {
          const transactionResponse = await wallet.sendTransaction(tx);
          console.log(`发送交易成功，哈希: ${transactionResponse.hash}`);

          // 等待交易被区块确认
          await transactionResponse.wait();
          console.log(`交易确认成功，资金已归集到: ${targetAddress}`);
        } catch (error) {
          console.error(`交易失败: ${error.message}`);
        }
      } else {
        console.log(`钱包余额不足以支付手续费: ${wallet.address}`);
      }
    } else {
      console.log(`钱包余额为 0: ${wallet.address}`);
    }
  }
}

// 执行归集操作
collectFunds();